From 4d9a94333820edb8dfbd8584605e661d18467e64 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Wed, 19 Aug 2015 23:17:01 -0400 Subject: [PATCH] gtk-demo: Add a model button demo This shows how to hook model buttons up to various action types, or how to create them manually. --- demos/gtk-demo/Makefile.am | 1 + demos/gtk-demo/demo.gresource.xml | 4 + demos/gtk-demo/modelbutton.c | 69 ++++++++++++ demos/gtk-demo/modelbutton.ui | 168 ++++++++++++++++++++++++++++++ 4 files changed, 242 insertions(+) create mode 100644 demos/gtk-demo/modelbutton.c create mode 100644 demos/gtk-demo/modelbutton.ui diff --git a/demos/gtk-demo/Makefile.am b/demos/gtk-demo/Makefile.am index d85e7cab17..088c2510ed 100644 --- a/demos/gtk-demo/Makefile.am +++ b/demos/gtk-demo/Makefile.am @@ -41,6 +41,7 @@ demos_base = \ list_store.c \ markup.c \ menus.c \ + modelbutton.c \ offscreen_window.c \ offscreen_window2.c \ overlay.c \ diff --git a/demos/gtk-demo/demo.gresource.xml b/demos/gtk-demo/demo.gresource.xml index 70eb3b9bc7..a3a3455577 100644 --- a/demos/gtk-demo/demo.gresource.xml +++ b/demos/gtk-demo/demo.gresource.xml @@ -147,6 +147,7 @@ list_store.c markup.c menus.c + modelbutton.c offscreen_window.c offscreen_window2.c overlay.c @@ -209,4 +210,7 @@ scale.ui + + modelbutton.ui + diff --git a/demos/gtk-demo/modelbutton.c b/demos/gtk-demo/modelbutton.c new file mode 100644 index 0000000000..8dafda89c3 --- /dev/null +++ b/demos/gtk-demo/modelbutton.c @@ -0,0 +1,69 @@ +/* Model Button + * + * GtkModelButton is a button widget that is designed to be used with + * a GAction as model. The button will adjust its appearance according + * to the kind of action it is connected to. + * + * It is also possible to use GtkModelButton without a GAction. In this + * case, you should set the "role" attribute yourself, and connect to the + * "clicked" signal as you would for any other button. + * + * A common use of GtkModelButton is to implement menu-like content + * in popovers. + */ + +#include + +static void +tool_clicked (GtkButton *button) +{ + gboolean active; + + g_object_get (button, "active", &active, NULL); + g_object_set (button, "active", !active, NULL); +} + +GtkWidget * +do_modelbutton (GtkWidget *do_widget) +{ + static GtkWidget *window = NULL; + static GActionEntry win_entries[] = { + { "color", NULL, "s", "'red'", NULL }, + { "chocolate", NULL, NULL, "true", NULL }, + { "vanilla", NULL, NULL, "false", NULL }, + { "sprinkles", NULL, NULL, NULL, NULL } + }; + + if (!window) + { + GtkBuilder *builder; + GActionGroup *actions; + + builder = gtk_builder_new_from_resource ("/modelbutton/modelbutton.ui"); + gtk_builder_add_callback_symbol (builder, "tool_clicked", G_CALLBACK (tool_clicked)); + gtk_builder_connect_signals (builder, NULL); + window = GTK_WIDGET (gtk_builder_get_object (builder, "window1")); + gtk_window_set_screen (GTK_WINDOW (window), + gtk_widget_get_screen (do_widget)); + g_signal_connect (window, "destroy", + G_CALLBACK (gtk_widget_destroyed), &window); + + actions = (GActionGroup*)g_simple_action_group_new (); + g_action_map_add_action_entries (G_ACTION_MAP (actions), + win_entries, G_N_ELEMENTS (win_entries), + window); + gtk_widget_insert_action_group (window, "win", actions); + + + g_object_unref (builder); + } + + if (!gtk_widget_get_visible (window)) + gtk_widget_show_all (window); + else + gtk_widget_destroy (window); + + + return window; +} + diff --git a/demos/gtk-demo/modelbutton.ui b/demos/gtk-demo/modelbutton.ui new file mode 100644 index 0000000000..39121a399a --- /dev/null +++ b/demos/gtk-demo/modelbutton.ui @@ -0,0 +1,168 @@ + + + + + + + True + True + Model Button + + + + + True + vertical + 80 + + + True + thing_a + + + True + Color + True + + + + + + + True + thing_b + + + True + Flavors + True + + + + + + + True + thing_c + + + True + Tools + True + + + + + + + + + + + True + 10 + vertical + + + True + fill + win.color + 'red' + Red + True + + + + + True + fill + win.color + 'green' + Green + True + + + + + True + fill + win.color + 'blue' + Blue + True + + + + + + + + + True + 10 + vertical + 10 + + + True + win.chocolate + Chocolate + + + + + True + win.vanilla + Vanilla + + + + + True + + + + + True + win.sprinkles + Add Sprinkles + + + + + + + + + True + 10 + vertical + 10 + + + True + Hammer + check + + + + + + True + Screwdriver + check + + + + + + True + Drill + check + + + + + + + -- 2.30.2